{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<ul id=\"breadcrumb\">\n",
    "<li><a href=\"#第2章-感知机\">&nbsp;</a></li>\n",
    "<li><a href=\"#二分类模型\">分类模型</a></li>\n",
    "<li><a href=\"#算法\">算法要点</a></li>\n",
    "<li><a href=\"#iris数据集\">iris数据集</a></li>\n",
    "<li><a href=\"#Perceptron\">感知机</a></li>\n",
    "<li><a href=\"#scikit-learn实例\">scikit感知机</a></li>\n",
    "</ul>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 第2章 感知机"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1．感知机是根据输入实例的特征向量$x$对其进行二类分类的线性分类模型：\n",
    "\n",
    "$$\n",
    "f(x)=\\operatorname{sign}(w \\cdot x+b)\n",
    "$$\n",
    "\n",
    "感知机模型对应于输入空间（特征空间）中的分离超平面$w \\cdot x+b=0$。\n",
    "\n",
    "2．感知机学习的策略是极小化损失函数：\n",
    "\n",
    "$$\n",
    "\\min _{w, b} L(w, b)=-\\sum_{x_{i} \\in M} y_{i}\\left(w \\cdot x_{i}+b\\right)\n",
    "$$\n",
    "\n",
    "损失函数对应于误分类点到分离超平面的总距离。\n",
    "\n",
    "3．感知机学习算法是基于随机梯度下降法的对损失函数的最优化算法，有原始形式和对偶形式。算法简单且易于实现。原始形式中，首先任意选取一个超平面，然后用梯度下降法不断极小化目标函数。在这个过程中一次随机选取一个误分类点使其梯度下降。\n",
    " \n",
    "4．当训练数据集线性可分时，感知机学习算法是收敛的。感知机算法在训练数据集上的误分类次数$k$满足不等式：\n",
    "\n",
    "$$\n",
    "k \\leqslant\\left(\\frac{R}{\\gamma}\\right)^{2}\n",
    "$$\n",
    "\n",
    "当训练数据集线性可分时，感知机学习算法存在无穷多个解，其解由于不同的初值或不同的迭代顺序而可能有所不同。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 二分类模型 \n",
    "$f(x) = sign(w\\cdot x + b)$\n",
    "\n",
    "$\\operatorname{sign}(x)=\\left\\{\\begin{array}{ll}{+1,} & {x \\geqslant 0} \\\\ {-1,} & {x<0}\\end{array}\\right.$\n",
    "\n",
    "给定训练集：\n",
    "\n",
    "$T=\\left\\{\\left(x_{1}, y_{1}\\right),\\left(x_{2}, y_{2}\\right), \\cdots,\\left(x_{N}, y_{N}\\right)\\right\\}$\n",
    "\n",
    "定义感知机的损失函数 \n",
    "\n",
    "$L(w, b)=-\\sum_{x_{i} \\in M} y_{i}\\left(w \\cdot x_{i}+b\\right)$\n",
    "\n",
    "---\n",
    "#### 算法\n",
    "\n",
    "随即梯度下降法 Stochastic Gradient Descent\n",
    "\n",
    "随机抽取一个误分类点使其梯度下降。\n",
    "\n",
    "$w = w + \\eta y_{i}x_{i}$\n",
    "\n",
    "$b = b + \\eta y_{i}$\n",
    "\n",
    "当实例点被误分类，即位于分离超平面的错误侧，则调整$w$, $b$的值，使分离超平面向该无分类点的一侧移动，直至误分类点被正确分类"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### iris数据集\n",
    "iris数据集中两个分类的数据和[sepal length，sepal width]作为特征\n",
    "![Sepal vs. Petal](images/sepal_petal.jpg)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-11-16T14:10:58.309841Z",
     "start_time": "2020-11-16T14:10:57.478406Z"
    }
   },
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "from sklearn.datasets import load_iris\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-11-16T14:10:58.343274Z",
     "start_time": "2020-11-16T14:10:58.326185Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "2    50\n",
       "1    50\n",
       "0    50\n",
       "Name: label, dtype: int64"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# load data\n",
    "iris = load_iris()\n",
    "df = pd.DataFrame(iris.data, columns=iris.feature_names)\n",
    "df['label'] = iris.target\n",
    "print(iris.feature_names)\n",
    "df.label.value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-11-16T14:11:00.312272Z",
     "start_time": "2020-11-16T14:11:00.089605Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x7fc497921278>"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(df[:50]['sepal length (cm)'], df[:50]['sepal width (cm)'], label='0')\n",
    "plt.scatter(df[50:100]['sepal length (cm)'], df[50:100]['sepal width (cm)'], label='1')\n",
    "plt.xlabel('sepal length')\n",
    "plt.ylabel('sepal width')\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-11-16T14:11:05.431411Z",
     "start_time": "2020-11-16T14:11:05.425995Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(100, 3)\n"
     ]
    }
   ],
   "source": [
    "data = np.array(df.iloc[:100, [0, 1, -1]])\n",
    "print(data.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-11-16T14:11:06.398619Z",
     "start_time": "2020-11-16T14:11:06.390572Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[5.1 3.5]\n",
      " [4.9 3. ]\n",
      " [4.7 3.2]\n",
      " [4.6 3.1]\n",
      " [5.  3.6]\n",
      " [5.4 3.9]\n",
      " [4.6 3.4]\n",
      " [5.  3.4]\n",
      " [4.4 2.9]\n",
      " [4.9 3.1]] [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n"
     ]
    }
   ],
   "source": [
    "X, y = data[:,:-1], data[:,-1]\n",
    "print(X[:10], y[:10])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-11-16T14:11:07.706730Z",
     "start_time": "2020-11-16T14:11:07.698305Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[-1 -1 -1 -1 -1 -1 -1 -1 -1 -1]\n"
     ]
    }
   ],
   "source": [
    "y = np.array([1 if i == 1 else -1 for i in y])\n",
    "print(y[:10])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Perceptron"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-11-16T14:11:13.518862Z",
     "start_time": "2020-11-16T14:11:13.510021Z"
    }
   },
   "outputs": [],
   "source": [
    "# 数据线性可分，二分类数据\n",
    "# 此处为一元一次线性方程\n",
    "class Model:\n",
    "    def __init__(self):\n",
    "        self.w = np.ones(len(data[0]) - 1, dtype=np.float32)\n",
    "        self.b = 0\n",
    "        self.l_rate = 0.1\n",
    "        # self.data = data\n",
    "\n",
    "    def sign(self, x, w, b):\n",
    "        y = np.dot(x, w) + b\n",
    "        return y\n",
    "\n",
    "    # 随机梯度下降法\n",
    "    def fit(self, X_train, y_train):\n",
    "        is_wrong = False\n",
    "        while not is_wrong:\n",
    "            wrong_count = 0\n",
    "            for d in range(len(X_train)):\n",
    "                X = X_train[d]\n",
    "                y = y_train[d]\n",
    "                if y * self.sign(X, self.w, self.b) <= 0:\n",
    "                    self.w = self.w + self.l_rate * np.dot(y, X)\n",
    "                    self.b = self.b + self.l_rate * y\n",
    "                    wrong_count += 1\n",
    "            if wrong_count == 0:\n",
    "                is_wrong = True\n",
    "        return 'Perceptron Model!'\n",
    "\n",
    "    def score(self):\n",
    "        pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-11-16T14:31:46.593265Z",
     "start_time": "2020-11-16T14:31:46.280381Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(8.0, -10.0)^T*x -12.1\n"
     ]
    }
   ],
   "source": [
    "perceptron = Model()\n",
    "perceptron.fit(X, y)\n",
    "print(\"{}^T*x {:.1f}\".format(tuple(np.round(perceptron.w)), perceptron.b))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-11-15T04:24:39.569120Z",
     "start_time": "2020-11-15T04:24:39.398430Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x7fd9fa3e4940>"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_points = np.linspace(4, 7, 10)\n",
    "y_ = -(perceptron.w[0] * x_points + perceptron.b) / perceptron.w[1]\n",
    "plt.plot(x_points, y_)\n",
    "\n",
    "plt.plot(data[:50, 0], data[:50, 1], 'bo', color='blue', label='0')\n",
    "plt.plot(data[50:100, 0], data[50:100, 1], 'bo', color='orange', label='1')\n",
    "plt.xlabel('sepal length (cm)')\n",
    "plt.ylabel('sepal width (cm)')\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### scikit-learn实例"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-11-15T04:24:39.575520Z",
     "start_time": "2020-11-15T04:24:39.572187Z"
    }
   },
   "outputs": [],
   "source": [
    "import sklearn\n",
    "from sklearn.linear_model import Perceptron"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-11-15T04:24:39.582040Z",
     "start_time": "2020-11-15T04:24:39.577764Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'0.21.3'"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sklearn.__version__"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-11-15T04:24:39.591413Z",
     "start_time": "2020-11-15T04:24:39.584767Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Perceptron(alpha=0.0001, class_weight=None, early_stopping=False, eta0=1.0,\n",
       "           fit_intercept=True, max_iter=1000, n_iter_no_change=5, n_jobs=None,\n",
       "           penalty=None, random_state=0, shuffle=True, tol=0.001,\n",
       "           validation_fraction=0.1, verbose=0, warm_start=False)"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "clf = Perceptron(fit_intercept=True, \n",
    "                 max_iter=1000, \n",
    "                 shuffle=True)\n",
    "clf.fit(X, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-11-15T04:24:39.599778Z",
     "start_time": "2020-11-15T04:24:39.594693Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 23.2 -38.7]] [-5.]\n"
     ]
    }
   ],
   "source": [
    "# Weights assigned to the features. # 截距 Constants in decision function.\n",
    "print(clf.coef_, clf.intercept_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-11-15T04:24:39.822571Z",
     "start_time": "2020-11-15T04:24:39.602487Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x7fd9fa4be2e8>"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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VmafxcBWzzXN1uFcLiOn7ANZazOADIDk5GR1hBURkYi1bt06ateuTWJiIs610yXUWWvZtm0b69ato0WLFpW6j19OO1prb/Bcy2wgMK+c4AXwIs5FaWvgBLWf/VGLiIhIuCgoKKBBgwYKXmHEGEODBg28mq0MSKsJY0wvoJe19oVSw38F/oFzgdsndCFYERERFLzCkLfvmV9bTVhrc6y1F1hrZ5cJXlhrl1prz7LWdvWcWhQREZEQ0Lp162Pus3HjRv7617/6tY53333Xr48fLLq8kIiISJhyuyExEWJinK07gM2bTjnlFP785z/79TkUvkRERCRkuN2Qmgq5uWCts01N9X0Ay8nJISUlhSFDhjB48ODDxm+55Zbfb69cuZLevXvTrVs30tPTK3y88vZbtWoV5557LsnJyfz73/9m165d9OnTh6ysLPr06cOzzz4LwPz58+nVqxfdunXD7XmhP/zwAz169KBLly6/h7Xvv/+ezp070717dyZPnuzbA+IDCl8iIiJhaPRoyM8/fCw/3xn3tSlTpjBkyBDefvvtCvf5/PPPueqqq/jpp5+Ij4+nuLiYPn36HPb14YcfHrEfwP3338/jjz/O7NmzefbZZ6lTpw6zZs2ic+fOzJo1iwceeACAP/3pT4wbN45Zs2bx3HPPsXPnTiZOnMj999/P7NmzqVmzJgCbN2/m008/5d133+Wtt97y/QE5QWF1bUcRERFx5OV5N34iLrroInr27HnUfW688UYefPBBLr/8ci677DJiY2OZNWvWEftt3rz5sP3AmQ177LHHMMZQXFzMzp07qV+//hH33bZtGy1btgSgXbt2ZGdnM2LECB599FHefffd32fiiouLSUtLo2nTpvz2228n+Op9T+FLREQkDMXHO6cayxv3tVq1ah1zn2+//ZYHH3yQ1q1b07JlS4YMGVJu09Hy9mvbti0vvfQSLVq04OWXX6Zq1aoA1KhRg3379uFyuTDG0LBhQ3Jycjj11FNZsWIFLVq0YNy4cbz66qtUr16dpKQkrr76ah599FGWL1/OypUr+dOf/uTz43GiFL5ERETCUHq6s8ar9KlHl8sZD4bWrVtz4403UlRUxCWXXFJht/fy9nvmmWe47bbb2L17N+ecc87vpw9TU1Pp168fderU4euvv+bVV1/lhhtuoLCwkPvuu4969erRsmVLLr74YgoL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\n",
      "text/plain": [
       "<Figure size 720x720 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签\n",
    "plt.rcParams['axes.unicode_minus']=False   #这两行需要手动设置\n",
    "# 画布大小\n",
    "plt.figure(figsize=(10,10))\n",
    "\n",
    "# 中文标题\n",
    "plt.rcParams['font.sans-serif']=['SimHei']\n",
    "plt.rcParams['axes.unicode_minus'] = False\n",
    "plt.title('鸢尾花线性数据示例')\n",
    "\n",
    "plt.scatter(data[:50, 0], data[:50, 1], c='b', label='Iris-setosa',)\n",
    "plt.scatter(data[50:100, 0], data[50:100, 1], c='orange', label='Iris-versicolor')\n",
    "\n",
    "# 画感知机的线\n",
    "x_ponits = np.arange(4, 8)\n",
    "y_ = -(clf.coef_[0][0]*x_ponits + clf.intercept_)/clf.coef_[0][1]\n",
    "plt.plot(x_ponits, y_)\n",
    "\n",
    "# 其他部分\n",
    "plt.legend()  # 显示图例\n",
    "plt.grid(False)  # 不显示网格\n",
    "plt.xlabel('sepal length (cm)')\n",
    "plt.ylabel('sepal width (cm)')\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**注意 !**\n",
    "\n",
    "在上图中，有一个位于左下角的蓝点没有被正确分类，这是因为 SKlearn 的 Perceptron 实例中有一个`tol`参数。\n",
    "\n",
    "`tol` 参数规定了如果本次迭代的损失和上次迭代的损失之差小于一个特定值时，停止迭代。所以我们需要设置 `tol=None` 使之可以继续迭代："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-11-15T04:24:40.042870Z",
     "start_time": "2020-11-15T04:24:39.824535Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x7fd9fa746da0>"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x720 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "clf = Perceptron(fit_intercept=True, \n",
    "                 max_iter=1000,\n",
    "                 tol=None,\n",
    "                 shuffle=True)\n",
    "clf.fit(X, y)\n",
    "\n",
    "# 画布大小\n",
    "plt.figure(figsize=(10,10))\n",
    "\n",
    "# 中文标题\n",
    "plt.rcParams['font.sans-serif']=['SimHei']\n",
    "plt.rcParams['axes.unicode_minus'] = False\n",
    "plt.title('鸢尾花线性数据示例')\n",
    "\n",
    "plt.scatter(data[:50, 0], data[:50, 1], c='b', label='Iris-setosa',)\n",
    "plt.scatter(data[50:100, 0], data[50:100, 1], c='orange', label='Iris-versicolor')\n",
    "\n",
    "# 画感知机的线\n",
    "x_ponits = np.arange(4, 8)\n",
    "y_ = -(clf.coef_[0][0]*x_ponits + clf.intercept_)/clf.coef_[0][1]\n",
    "plt.plot(x_ponits, y_)\n",
    "\n",
    "# 其他部分\n",
    "plt.legend()  # 显示图例\n",
    "plt.grid(False)  # 不显示网格\n",
    "plt.xlabel('sepal length (cm)')\n",
    "plt.ylabel('sepal width (cm)')\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-11-15T04:24:40.049908Z",
     "start_time": "2020-11-15T04:24:40.045327Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 70.7 -87.9]] [-117.]\n"
     ]
    }
   ],
   "source": [
    "print(clf.coef_, clf.intercept_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "现在可以看到，所有的两种鸢尾花都被正确分类了。\n",
    "\n",
    "----\n",
    "参考代码：https://github.com/wzyonggege/statistical-learning-method\n",
    "\n",
    "中文注释制作：机器学习初学者\n",
    "\n",
    "微信公众号：ID:ai-start-com\n",
    "\n",
    "配置环境：python 3.5+\n",
    "\n",
    "代码全部测试通过。\n",
    "![gongzhong](images/gongzhong.jpg)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
